// #ifdef H5
// h5端
import Fly from "flyio/dist/npm/fly";
// #endif

// #ifdef APP-PLUS
// app端
import Fly from "flyio/dist/npm/wx";
// #endif

// #ifdef MP-WEIXIN
import Fly from "flyio/dist/npm/wx";
// #endif
// import { handleLoginFailure } from "@/utils";


const fly = new Fly()
fly.config.baseURL = ''

fly.interceptors.response.use(
	response => {
		// 定时刷新access-token
		return response;
	},
	error => {
		if (error.toString() == 'Error: Network Error') {
			// handleLoginFailure();
			return Promise.reject({
				msg: "未登录",
				toLogin: true
			});
		}
		if (error.status == 401) {
			// handleLoginFailure();
			return Promise.reject({
				msg: "未登录",
				toLogin: true
			});
		}
		// if (error.response&&error.response.data) {
		//   uni.showToast({
		//     title: error.response.data.msg,
		//     icon: "none",
		//     duration: 2000
		//   });
		// }
		return Promise.reject(error);
	}
);

const defaultOpt = {
	login: true
};

function baseRequest(options) {
	console.log(options)

	// 从缓存中获取 token 防止 token 失效后还会继续请求的情况
	const token = ''

	// 合并传参过来的 headers
	// 如果接口需要登录，携带 token 去请求

	options.headers = {
		...options.headers
	}

	// if (options.login === true) {
	// 	options.headers = {
	// 		...options.headers,
	// 		Authorization: "Bearer " + token
	// 	}
	// }

	// 如果需要登录才可访问的接口没有拿到 token 视为登录失效
	if (options.login === true && !token) {
		// 跳转到登录或授权页面
		// handleLoginFailure();
		// 提示错误信息
		return Promise.reject({
			msg: "未登录",
			toLogin: true
		});
	}
	// 结构请求需要的参数
	const {
		url,
		params,
		data,
		login,
		...option
	} = options

	// 发起请求
	return fly.request(url, params || data, {
		...option
	}).then(res => {
		console.log("请求成功")
		if (res.status === 200) {
			const data = res.data || {};
			if ([401].indexOf(data.code) !== -1) {
				// handleLoginFailure();
				return Promise.reject({
					msg: data.msg,
					res,
					data,
					toLogin: true
				});
			}
			return Promise.resolve(data);
		}
	});
}

const requestFly = ["post", "put", "patch"].reduce((request, method) => {
	/**
	 *
	 * @param url string 接口地址
	 * @param data object get参数
	 * @param options object axios 配置项
	 * @returns {AxiosPromise}
	 */
	request[method] = (url, data = {}, options = {}) => {
		return baseRequest(
			Object.assign({
				url,
				data,
				method
			}, defaultOpt, options)
		);
	};
	return request;
}, {});

["get", "delete", "head"].forEach(method => {
	/**
	 *
	 * @param url string 接口地址
	 * @param params object get参数
	 * @param options object axios 配置项
	 * @returns {AxiosPromise}
	 */
	requestFly[method] = (url, params = {}, options = {}) => {
		return baseRequest(
			Object.assign({
				url,
				params,
				method
			}, defaultOpt, options)
		);
	};
});

export default requestFly;